package cn.tedu.jedis;

import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;

public class MyShardedJedis {
    /**
     * 属性，list节点信息，保管了所有的集群节点内容
     * 有三个节点 list元素3个，5个节点 list元素5个
     */
    List<Jedis> nodes = new ArrayList<>();

    /**
     * 构造函数，每次构造必须传递所有节点的信息
     * @param nodes
     */
    public MyShardedJedis(List<Jedis> nodes) {
        this.nodes = nodes;
        // nodes = { new Jedis(6379), new Jedis(6380), new Jedis(6381) };
        // 下标 取余结果0 1 2
    }

    /**
     * 封装一个hash取余的算法，对任意的key值，找到对应节点
     */
    public Jedis keyAndNode(String key) {
        // hash取余公式
        int result = (key.hashCode() & Integer.MAX_VALUE) % nodes.size();
        return nodes.get(result);
    }

    /**
     * 只要对jedis的所有操作key值的方法重新封装一遍，当前分片对象就可以使用了
     * @param key
     * @return
     */
    public String get(String key) {
        Jedis jedis = keyAndNode(key);
        return jedis.get(key);
    }

    public void set(String key, String value) {
        Jedis jedis = keyAndNode(key);
        jedis.set(key, value);
    }

    public boolean eixsts(String key) {
        Jedis jedis = keyAndNode(key);
        return jedis.exists(key);
    }

    // ......
}
